package cc.rengu.igas.momp.common.dao;

import cc.rengu.igas.momp.common.entity.CpMcListInfoInObj;
import cc.rengu.igas.momp.common.entity.TMCouponInfo;
import cc.rengu.oltp.utility.bean.PageInfo;
import cc.rengu.oltp.utility.bean.PageResult;

import java.util.List;

/**
 * 卡券数据库操作接口定义
 *
 * @author Jinan Liu
 * @version 1.0.0
 * @date 2020/4/7 14:15
 */
public interface CouponInfoMapper {

    /**
     * 使用营销活动规则查询一张可领取卡券数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息表
     * @return cc.rengu.igas.momp.common.entity.TMCouponInfo 卡券信息表
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 14:17
     */
    TMCouponInfo selectClaimableCouponbyRuleIndex(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 使用卡券编号查询已锁定卡券信息数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息表
     * @return cc.rengu.igas.momp.common.entity.TMCouponInfo 卡券信息表
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 14:17
     */
    TMCouponInfo selectLockedCouponByPrimaryKey(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 使用主键更新卡券状态数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息
     * @return int
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 14:55
     */
    int updateCouponStatusByPrimaryKey(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 更新已锁定卡券相关信息数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息
     * @return int
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 14:55
     */
    int updateLockedCouponInfo(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 更新已锁定卡券相关信息和卡券有效期数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息
     * @return int
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 14:55
     */
    int updateLockedCouponInfoAndDate(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 使用营销活动编号查询指定营销活动对应的所有卡券信息数据库操作接口定义
     *
     * @param cpMcListInfoInObj 卡券类营销活动列表查询使用实体类入参
     * @param pageInfo          数据库操作分页实体类
     * @return cc.rengu.oltp.utility.bean.PageResult 查询结果列表
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 15:37
     */
    PageResult selectAllCouponInfoByMcNo(CpMcListInfoInObj cpMcListInfoInObj, PageInfo pageInfo) throws Exception;

    /**
     * 用户查询卡券列表信息(非分页)
     *
     * @param tMCouponInfo 卡券信息表实体类入参
     * @return java.util.List<cc.rengu.igas.momp.common.entity.TMCouponInfo> 卡券信息表
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2021/1/18 16:31
     */
    List<TMCouponInfo> getCouponListInfoByUser(TMCouponInfo tMCouponInfo) throws Exception;

    /**
     * 使用用户ID和营销活动编号查询指定营销活动对应的所有卡券信息数据库操作接口定义(分页)
     *
     * @param cpMcListInfoInObj 卡券类营销活动列表查询使用实体类入参
     * @param pageInfo          数据库操作分页实体类
     * @return cc.rengu.oltp.utility.bean.PageResult 查询结果列表
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 15:37
     */
    PageResult getAllCouponDetailInfoByUser(CpMcListInfoInObj cpMcListInfoInObj, PageInfo pageInfo) throws Exception;

    /**
     * 使用营销活动编号查询指定营销活动对应的所有卡券信息数据库操作接口定义
     *
     * @param instId 法人机构号
     * @param mcNo   营销活动编号
     * @param userId 用户ID
     * @return java.util.List<cc.rengu.igas.momp.common.entity.TMCouponInfo>
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 15:46
     */
    List<TMCouponInfo> selectAllCouponInfoByMcNo(String instId, String mcNo, String userId) throws Exception;

    /**
     * 退回卡券时更新卡券信息至初始状态数据库操作接口定义
     *
     * @param couponInfo 卡券信息
     * @return int 返回码
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/7 20:30
     */
    int updateCouponToInitialStatusByPrimaryKey(TMCouponInfo couponInfo) throws Exception;

    /**
     * 使用卡券编号查询单张卡券信息数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息
     * @return cc.rengu.igas.momp.common.entity.TMCouponInfo
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/21 10:29
     */
    TMCouponInfo selectSingleCouponInfoByCouponNo(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 卡券核销冲正数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息
     * @return int 返回码
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/23 19:23
     */
    int reverseRedeemedCoupon(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 查询用户已领取未核销卡券信息数据库操作接口定义
     *
     * @param instId 法人机构号
     * @param userId 用户ID
     * @return java.util.List<cc.rengu.igas.momp.common.entity.TMCouponInfo>
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/4/27 22:02
     */
    List<TMCouponInfo> selectUserCouponBoundListInfo(String instId, String userId, String txnDate) throws Exception;

    /**
     * 使用卡券基本信息查询可领取卡券信息数据库操作接口定义
     *
     * @param instId 法人机构号
     * @param mcNo   营销活动编号
     * @return cc.rengu.igas.momp.common.entity.TMCouponInfo 卡券信息表
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/6/8 16:52
     */
    TMCouponInfo selectSingleClaimableCouponbyMcNo(String instId, String mcNo) throws Exception;

    /**
     * 根据营销活动编号及规则顺序号查询卡券数据库操作接口实现
     *
     * @param instId    法人机构号
     * @param mcNo      营销活动编号
     * @param ruleIndex 规则编号
     * @return java.util.List<cc.rengu.igas.momp.common.entity.TMCouponInfo> 卡券信息表
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2020/6/20
     */
    List<TMCouponInfo> selectCouponInfoListByRuleIndex(String instId, String mcNo, String ruleIndex) throws Exception;

    /**
     * 卡券核销数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息表
     * @return int 返回码
     * @throws Exception 异常信息
     * @author Jinan Liu
     * @date 2020/7/22 17:26
     */
    int redeemSingleCoupon(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 领取免费型卡券更新卡券相关信息和卡券有效期
     *
     * @param tmCouponInfo 卡券信息
     * @return int
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2020/8/11 19:55
     */
    int updateCouponInfoAndDate(TMCouponInfo tmCouponInfo) throws Exception;

    /**
     * 使用营销活动规则查询一张可领取的免费卡券数据库操作接口定义
     *
     * @param tmCouponInfo 卡券信息
     * @param couponNo     卡券编号
     * @return int
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2020/8/12 19:55
     */
    TMCouponInfo mompSelectClaimableFreeCoupon(TMCouponInfo tmCouponInfo, String couponNo) throws Exception;

    /**
     * 查询用户已领取券信息 数量
     *
     * @param mcNo   活动编号
     * @param userId 用户ID
     * @return int 返回数量
     * @throws Exception 异常信息
     * @author ls
     * @date 2020/09/04 16:45
     */
    TMCouponInfo selectUserCouponCountByMarketingPlatform(String mcNo, String userId) throws Exception;

    /**
     * 查询 卡券已领取张数
     *
     * @param instId 机构编码
     * @param mcNo   营销活动编号
     * @return cc.rengu.igas.momp.common.entity.TMCouponInfo 卡券信息表
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2020-09-23 16:33:27
     */
    TMCouponInfo selectTMCouponClaimedCount(String instId, String mcNo) throws Exception;

    /**
     * 查询 卡已核销张数
     * (注： 2-已核销(最终状态))
     *
     * @param instId 机构编码
     * @param mcNo   营销活动编号
     * @return cc.rengu.igas.momp.common.entity.TMCouponInfo 卡券信息表
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2020-09-23 16:57:10
     */
    TMCouponInfo selectTMCouponRedeemedCount(String instId, String mcNo) throws Exception;

    /**
     * 用户查询自己的卡券信息（分页查询）
     *
     * @param tMCouponInfo 卡券信息
     * @param pageInfo     分页信息
     * @return cc.rengu.oltp.utility.bean.PageResult 查询结果列表
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2021/1/18 15:37
     */
    PageResult getUserCouponListInfoPage(TMCouponInfo tMCouponInfo, PageInfo pageInfo) throws Exception;

    /**
     * 查询用户在某一周期内已领取券信息 数量
     *
     * @param instId          法人机构号
     * @param mcNo            活动编号
     * @param userId          用户ID
     * @param periodStartDate 周期开始日期
     * @param periodEndDate   周期结束日期
     * @return int 返回数量
     * @throws Exception 异常信息
     * @author liujinan
     * @date 2020/09/04 16:45
     */
    TMCouponInfo selectUserCouponCountByInstIdAndMcNoAndDate(String instId, String mcNo, String userId, String periodStartDate, String periodEndDate) throws Exception;
}
